﻿Imports PTIC_Util
Imports OMANE.moteurTauxGaranti2

Public Interface IControleTraitements
    ReadOnly Property controleMoteurMethode2() As controleMoteurMethode2
    ReadOnly Property controleEcheancier() As controleEcheancier
    Function executeCalculTxGarMethode1()
End Interface

Public Class baseControleTraitements
    Implements IControleTraitements

    Protected _universOMANE As UniversOMANE
    Protected _controleEcheancier As controleEcheancier
    Protected _controleMoteurMethode2 As controleMoteurMethode2

    Public Sub New(ByVal universOMANE As UniversOMANE)
        _universOMANE = universOMANE
        _controleEcheancier = New controleEcheancier(_universOMANE)
        _controleMoteurMethode2 = New controleMoteurMethode2(_universOMANE, _universOMANE.listeTraitements.getTraitMoteurMethode2)
    End Sub

    'Récupération des implémentations de comportement
    Public ReadOnly Property controleEcheancier() As controleEcheancier Implements IControleTraitements.controleEcheancier
        Get
            Return _controleEcheancier
        End Get
    End Property
    Public ReadOnly Property controleMoteurMethode2() As controleMoteurMethode2 Implements IControleTraitements.controleMoteurMethode2
        Get
            Return _controleMoteurMethode2
        End Get
    End Property

    Public Function executeCalculTxGarMethode1() As Object Implements IControleTraitements.executeCalculTxGarMethode1
        'Récupérer le traitement permettant de calculer le taux garanti méthode 1
        'Vérifier que tous les paramètres rattachés au traitements sont valides.
        'Vérifier que le traitement s'est correctement exécuté (dans un bloc TRY ... CATCH)
        'Renvoyer un message indiquant que l'opération s'est déroulé correctement.
        'Comment récupérer le contrôleur de chaque paramètre

        'Le contrôleur de traitements doit prendre en paramètre le contrôleur de paramètres
        Return Nothing
    End Function

End Class

Public Class controleEcheancier

#Region "Variables globalesé"
    Protected _universOMANE As UniversOMANE
#End Region

#Region "Création d'une instance"
    Public Sub New(ByVal univers As UniversOMANE)
        _universOMANE = univers
    End Sub
#End Region

#Region "Modification du mode de recalcul"
    Public Sub setRecalcul(ByVal typeRecalcul As typeRecalcul)
        _universOMANE.listeTraitements.getTraitMoteurEcheancier.Recalcul = typeRecalcul
    End Sub
#End Region

#Region "Paramétrage de la table de mortalité"
    Public Sub setTableMortalite(ByVal nomFichier As String)
        Dim tbleMort As DataTable = _universOMANE.getTableBDDReferentiel("TableMortalite", nomFichier).execute_DataTable(False)
        Dim tableauMortalite(tbleMort.Rows.Count, 1) As Double, i As Integer = 0
        For Each r As DataRow In tbleMort.Rows
            tableauMortalite(i, 0) = r(0)
            tableauMortalite(i, 1) = 1 - (1 - r(1)) ^ (1 / 12)
            i = i + 1
        Next
        Dim tbleMortalite As New Actuariat.tableMortalite(tableauMortalite, nomFichier)
        _universOMANE.listeTraitements.getTraitMoteurEcheancier.setTableMort(tbleMortalite)
    End Sub
    Public Function getTableMortalite() As String
        Return _universOMANE.listeTraitements.getTraitMoteurEcheancier.getTableMort.nom
    End Function
#End Region

#Region "Paramétrage de la table de maintien en INCAP/INVAL"
    Public Sub setTableMaintienINCINV(ByVal nomFichier As String)
        'Récupération de la table dans le référentiel
        Dim tbleINCINV As DataTable = _universOMANE.getTableBDDReferentiel("tableINCINV", nomFichier).execute_DataTable(False)
        Dim tableau_INCINV(tbleINCINV.Rows.Count - 1, tbleINCINV.Columns.Count - 1) As Double
        For i As Integer = 0 To tbleINCINV.Rows.Count - 1
            For j As Integer = 0 To tbleINCINV.Columns.Count - 1
                tableau_INCINV(i, j) = tbleINCINV(i)(j)
            Next
        Next
        Dim tableMaintienINCINV As New Actuariat.tableMaintienINCAPINVAL(tableau_INCINV, 18, 64, nomFichier)
        _universOMANE.listeTraitements.getTraitMoteurEcheancier.setTableMaintienINCAPINVAL(tableMaintienINCINV)
    End Sub
    Public Function getTableMaintienINCINV() As String
        Return _universOMANE.listeTraitements.getTraitMoteurEcheancier.getTableMaintienINCAPINVAL.nom
    End Function
#End Region

#Region "Taux de remboursements anticipés"
    Public Sub setTxRembAnti(ByVal txRembAnti As String)
        '_universOMANE.listeTraitements.getTraitMoteurEcheancier.setTxRembAnti()
        'On vérifie que le taux de remboursements anticipés demandé est bien un numérique
        Dim txRembAntiMens As Double = Actuariat.mensualise_tx(CDbl(txRembAnti), Actuariat.typeMensualisation.tauxProportionel)
        If txRembAntiMens <> _universOMANE.listeTraitements.getTraitMoteurEcheancier.getTxRembAnti Then
            _universOMANE.listeTraitements.getTraitMoteurEcheancier.setTxRembAnti(txRembAntiMens)
        End If
    End Sub
    Public Function getTxRembAntiAnn() As String
        Return Math.Round((_universOMANE.listeTraitements.getTraitMoteurEcheancier.getTxRembAnti) * 12, 4)
    End Function
#End Region

#Region "Taux nominal"
    Public Sub setTxNom(ByVal txNomAnn As String)
        '_universOMANE.listeTraitements.getTraitMoteurEcheancier.setTxRembAnti()
        'On vérifie que le taux de remboursements anticipés demandé est bien un numérique
        Dim txNomMens As Double = Actuariat.mensualise_tx(CDbl(txNomAnn), Actuariat.typeMensualisation.tauxProportionel)
        If txNomMens <> _universOMANE.listeTraitements.getTraitMoteurEcheancier.getTxNomPer Then
            _universOMANE.listeTraitements.getTraitMoteurEcheancier.setTxNomPer(txNomMens)
        End If
    End Sub
    Public Function getTxNomAnn() As String
        Return Math.Round((_universOMANE.listeTraitements.getTraitMoteurEcheancier.getTxNomPer) * 12, 4)
    End Function
#End Region

#Region "Taux technique"
    Public Sub setTxTech(ByVal txtTxTech As String)
        Dim txTech As Double = Actuariat.mensualise_tx(CDbl(txtTxTech), Actuariat.typeMensualisation.tauxEquivalent)
        _universOMANE.listeTraitements.getTraitMoteurEcheancier.setTxTech(txTech)
    End Sub
    Public Function getTxTech() As Double
        Return Math.Round(((1 + _universOMANE.listeTraitements.getTraitMoteurEcheancier.getTxTech) ^ 12) - 1, 4)
    End Function
#End Region

#Region "Tarif INCINV"
    Public Sub setTarifINCINV(ByVal tarifINCINVan As String)
        '_universOMANE.listeTraitements.getTraitMoteurEcheancier.setTxRembAnti()
        'On vérifie que le taux de remboursements anticipés demandé est bien un numérique
        Dim tarifINCINVper As Double = Actuariat.mensualise_tx(CDbl(tarifINCINVan), Actuariat.typeMensualisation.tauxProportionel)
        If tarifINCINVper <> _universOMANE.listeTraitements.getTraitMoteurEcheancier.getTarifINCINV Then
            _universOMANE.listeTraitements.getTraitMoteurEcheancier.setTarifINCINV(tarifINCINVper)
        End If
    End Sub
    Public Function getTarifINCINV() As String
        Return Math.Round((_universOMANE.listeTraitements.getTraitMoteurEcheancier.getTarifINCINV) * 12, 5)
    End Function
#End Region

#Region "Tarif DC"
    Public Sub setTarifDC(ByVal tarifDCan As String)
        '_universOMANE.listeTraitements.getTraitMoteurEcheancier.setTxRembAnti()
        'On vérifie que le taux de remboursements anticipés demandé est bien un numérique
        Dim tarifDCper As Double = Actuariat.mensualise_tx(CDbl(tarifDCan), Actuariat.typeMensualisation.tauxProportionel)
        If tarifDCper <> _universOMANE.listeTraitements.getTraitMoteurEcheancier.getTarifDC Then
            _universOMANE.listeTraitements.getTraitMoteurEcheancier.setTarifDC(tarifDCper)
        End If
    End Sub
    Public Function getTarifDC() As String
        Return Math.Round((_universOMANE.listeTraitements.getTraitMoteurEcheancier.getTarifDC) * 12, 4)
    End Function
#End Region

End Class

Public Class controleMoteurMethode2

    Protected _univers As UniversOMANE
    Protected _moteurMethode2 As Moteur_Methode2

    Public Sub New(ByVal univers As UniversOMANE, ByVal moteurMethode2 As Moteur_Methode2)
        _univers = univers
        _moteurMethode2 = moteurMethode2
    End Sub

#Region "Paramètres spécifiques du moteur 2"

    Public Sub setNbGenProj(ByVal nbGenProj As Integer)
        _moteurMethode2.nbGenProj = nbGenProj
    End Sub
    Public Sub setCroissPopAssuNb(ByVal croissPopAssuNb As Double)
        _moteurMethode2.croissPopAssuNb = croissPopAssuNb
    End Sub
    Public Sub setCroissCapIni(ByVal croissCapIni As Double)
        _moteurMethode2.croissCapIni = croissCapIni
    End Sub
    Public Sub setCalculBasePourCapIni()
        _moteurMethode2.capitauxInitiaux.methodeCalcul = Moteur_Methode2.gestionParametreGlobal.typeCalcul.DepuisBase
    End Sub
    Public Sub setCalculPersoPourCapIni()
        _moteurMethode2.capitauxInitiaux.methodeCalcul = Moteur_Methode2.gestionParametreGlobal.typeCalcul.Personnalisé
    End Sub
    Public Sub setCalculBasePourNbAssu()
        _moteurMethode2.nbPretsAssuGen1.methodeCalcul = Moteur_Methode2.gestionParametreGlobal.typeCalcul.DepuisBase
    End Sub
    Public Sub setCalculPersoPourNbAssu()
        _moteurMethode2.nbPretsAssuGen1.methodeCalcul = Moteur_Methode2.gestionParametreGlobal.typeCalcul.Personnalisé
    End Sub
    Public Sub setEncTotGen1(ByVal capitauxInitiaux As Double)
        _moteurMethode2.capitauxInitiaux.valeurPerso = capitauxInitiaux
    End Sub
    Public Sub setNbPretsAssuGen1(ByVal nbPretsAssuGen1 As Double)
        _moteurMethode2.nbPretsAssuGen1.valeurPerso = nbPretsAssuGen1
    End Sub

#End Region

#Region "Filtres sur les segments ou les générations"
    Public Sub setFiltreGeneration(ByVal filtreGeneration As String)
        If filtreGeneration = "TOUTES" Then
            _moteurMethode2.filtreGeneration = 0
        Else
            _moteurMethode2.filtreGeneration = CInt(filtreGeneration)
        End If
    End Sub
    Public Sub setFiltreSegmentation(ByVal filtreSegment As String)
        If filtreSegment = "TOUS" Then
            _moteurMethode2.filtreSegment = 0
        Else
            _moteurMethode2.filtreSegment = CInt(filtreSegment)
        End If
    End Sub
#End Region

#Region "Exécution du scénario central"
    Public Sub calculeScenCent()
        _moteurMethode2.validePossibiliteCalcule()
        _moteurMethode2.scenarioCentral.Calculer()
    End Sub
#End Region

End Class